
# 创建一个自己的容器类，MyList, 实现各种运算符的重载
# class MyList:
#     def __init__(self, iterable):
#         ...
#
# L1 = MyList(range(1, 6, 2))
# L2 = MyList([2, 4, 6])
# print(L1)  # | 1 3 5 |
# print(L2)  # | 2 4 6 |
# L3 = L1 + L2
# print(L3)  # | 3 7 11 |
# print(L1)  # | 1 3 5 |
# print(L2)  # | 2 4 6 |
# L4 = L3 * 2
# print(L4)  # | 6 14 22 |
# print(L3)  # | 3 7 11 |

# 创建一个自己的容器类，MyList, 实现各种运算符的重载
class MyList:
    def __init__(self, iterable):
        # 遍历 可迭代对象，将内部的数据复制为列表，绑定在自己的__data属性中
        self.__data = list(iterable)
    def __str__(self):
        '''将自己转化为能够表达自己数据的字符串
        如： self.__data = [1, 2, 3]
        返回：  '| 1 2 3 |'
        '''
        s = '| '
        # 在此处追加数据到字符串 s 末尾
        for number in self.__data:
            s += str(number) + ' '
        s += '|'
        return s

    def __add__(self, other):
        '''用self.__data 列表和 other.__data列表对应元素相加
        生成新的列表，在用新的列表创建一个MyList类型的对象返回。
        '''  'self.__data = [1, 3, 5], other.__data=[2, 4, 6]'
        L = []  # 用于保存计算后的结果
        # 依次同时遍历,self.__data 和 other.__data 这两个列表。
        # 将对应位置的数据相加后放入L中
        for index in range(len(self.__data)):  # index为索引
            L.append(self.__data[index] + other.__data[index])

        result = MyList(L)
        return result

    def __mul__(self, other):
        '''用self.__data 列表和 other 绑定的整数和 对应元素相乘
        生成新的列表，在用新的列表创建一个MyList类型的对象返回。
        '''  'self.__data = [3, 7, 11], other = 2'
        L = []
        for value in self.__data:
            L.append(value * other)

        result = MyList(L)  # .__data = []
        return result

L1 = MyList(range(1, 6, 2))
L2 = MyList([2, 4, 6])
print(L1)  # | 1 3 5 |
print(L2)  # | 2 4 6 |
L3 = L1 + L2  # 等同于 L1.__add__(L2)
print(L3)  # | 3 7 11 |
print(L1)  # | 1 3 5 |
print(L2)  # | 2 4 6 |
L4 = L3 * 2  # L3.__mul__(2)
print(L4)  # | 6 14 22 |
print(L3)  # | 3 7 11 |

